FPGA technology provides a flexible means to quickly transform a logic design into a working microelectronic chip by allowing a pre-fabricated chip to be programmed according to the specific design. An FPGA device (chip) comprises logic blocks, interconnects and input/output (I/O) blocks. These are pre-fabricated logic resources on an FPGA device with fixed locations, but many, and desirably most, of the resources on an FPGA device can be programmed to realize different logic functions and generate different signal paths to realize different logic designs.
There are usually two types of logic blocks on an FPGA device. The generic or generic logic block type can be programmed to realize any of many different logic functions. The dedicated type of logic block can only be programmed to realize a specific type of logic function (but in different sizes and configurations). One example of a function of a dedicated logic is as a memory module. In such a case, the dedicated logic block when programmed is a dedicated memory module. Most of the logic blocks on an FPGA device are of the generic type. Generic logic blocks are typically evenly distributed on an FPGA device. The logic blocks of the dedicated type are available only for limited types of logic functions and typically are only available in small quantities. Dedicated logic blocks are sparsely located on an FPGA device.
Memory modules or memory elements are important components of modern logic circuit designs. A simplified view of a memory module is as a collection of memory cells, each of which can store a single bit of information and can be read from and/or written into. The input/output signals pertaining to reading the information form a read port. The signals pertaining to writing the information form a write port. A port, in one alternative form, can also serve as both a read port and a write port.
A port in one exemplary form comprises an address bus, which is desirably a collection of input signals that select the memory cells to be accessed. A read port in one form has an output data bus, which is desirably a collection of signals that carries the information from selected memory cells. A write port in one form has an input data bus, which is desirably a collection of signals that carry information that is to be written to the selected memory cells. Each port also desirably has a number of control signals, such as clock signals that synchronize the operations of the memory module, enable signals that enable and disable the operations, and set/rest signals that apply special content to the memory cells and/or the output buses.
In one form of design implementation using an FPGA device, a memory module may be realized using generic logic blocks. This form of memory module implementation is referred to as a distributed memory implementation. Alternatively, in another form of design implementation using an FPGA device, a memory module may be realized using dedicated logic blocks for memories. This latter form of memory module implementation is referred to as a block memory implementation. If the size of the memory module exceeds the capacity of a single logic block of the chosen type, multiple blocks can be used, including blocks realizing the memory cells, and blocks realizing auxiliary logic that combine the blocks realizing the memory cells together.
It is rare that a memory module will fit into a single generic block. Memory implementation using dedicated memory blocks is often more efficient for large memory modules and is therefore often preferred by those skilled in the art of FPGA design. On the other hand, dedicated memory blocks on a FPGA are of limited quantity. When the total need for memory modules in a circuit design being implemented on an FPGA exceeds the available supply of dedicated memory blocks, or when other concerns arise, some memory modules may have to be implemented using distributed generic logic blocks. Determining which realization strategy to use for a memory module, or a portion of a module, is an important decision in the art of FPGA design.
Known approaches for implementing memory in a circuit design on an FPGA determine which blocks to be used to implement memory module(s) prior to the logic functions of the design being arranged and connected on the FPGA device. This is necessary in these known approaches because the arrangement and connection (placement and routing) requires that the logic functions be generated first. However, this also limits the ability to determine the optimal strategy for memory realization.
Because dedicated blocks are few and sparsely positioned, a memory module which is implemented using a dedicated block may have to be placed far away from its signal sources and/or destinations, yielding large signal propagation delays from and/or to the memory module. This adverse impact is difficult to foresee prior to placement and routing. Similarly, the implementation of memory using a combination of distributed blocks may also result in exceedingly large signal propagation delays at their inputs and/or outputs. In addition, large delays may be present in block-to-block interconnects, such as when there are so many logic blocks in the memory that they cannot readily be placed in a close proximity with their signal sources and/or destinations. Again, such impacts may only become clear after placement and routing is completed. In either case, any larger than anticipated signal delays will cause the design to operate at a slower speed.
Accordingly, a need exists for improvements in memory implementation on FPGAs which desirably takes into consideration the resource availability and distribution.